#pragma once

namespace CPreProc
{
  class MacroTests
  {
  public:
    static void         test_define_parsing();
    static void         test_parse_empty_replacement_list();
    static void         test_macro_constructor1();
    static void         test_macro_constructor2();

    static void         test_no_macros();
    static void         test_simple_replacement();
    static void         test_collapse_whitespace();
    static void         test_vararg_replacement();

    static void         test_argument_list();
    /// If there's a space between the macro name, and something that
    /// looks like an argument list, it's not considered an argument list,
    /// but just the replacement list instead.
    static void         test_space_before_arg_list();

    /// funky name for the following test case:
    ///   #define A(a,b)  a + b
    ///   #define B       A ( 100
    ///   #define C       ,200)
    ///   #define D       B C
    /// - evaluate D
    /// where a call to the macro D is composed of the result of 
    /// both B and C.
    static void         test_recursion_fusion();

    static void         test_sharp_operator();
    static void         test_double_sharp_operator();
    static void         test_double_sharp_operator_from_standard();

    static void         test_replacement_list_equality();
  };
}

